package rmiteste;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Mensageiro extends UnicastRemoteObject implements Interfaces {

    public String[] clientes = new String[1000];
    public int id = 0;
    public String[][] mensagens = new String[1000][1000];
    private Timer tempo;
    private TimerTask tarefa;
    private int segundos[] = new int[1000];
    private Date data = new Date();

    public Mensageiro() throws RemoteException {
        super();
        data = new Date();
        tarefa = new atualizarserv();
        tempo = new Timer();
        tempo.schedule(tarefa, 0, 1 * 2000);
    }

    /**
     * envia uma mensagem a um cliente identificado pelo id
     */
    public void enviarMensagem(int id, String msg, int remetente) throws RemoteException {
        segundos[remetente] = data.getSeconds();
        int j = 0;
        while (mensagens[id][j] != null) {
            j++;
        }
        mensagens[id][j] = clientes[remetente] + "(" + remetente + ")->(" + id + ")" + getData() + ":\n " + msg;


//        System.out.println(clientes[id] + ": " + msg);
    }

    public void enviarMensagem(String msg, int remetente) throws RemoteException {
        segundos[remetente] = data.getSeconds();
        for (int i = 0; i < id; i++) {
            int j = 0;
            while (mensagens[i][j] != null) {
                j++;
            }
            mensagens[i][j] = clientes[remetente] + "(" + remetente + ")" + "->(T)" + getData() + ":\n " + msg;
//            System.out.println(i + "." + j + ": " + msg);
        }

    }

    /**
     * retorna uma mensagem enviado ao cliente identificado pelo id
     */
    public String lerMensagem(int id) throws RemoteException {

        return mensagens[id][0];
    }

    public String[] lerMensagens(int _id) throws RemoteException {
        segundos[_id] = data.getSeconds();
        int j = 0;
        while (mensagens[_id][j] != null) {
            j++;
        }

        String[] str = new String[j];
//        j = 0;

        for (int i = 0; i < j; i++) {
            str[i] = mensagens[_id][i];
        }

        mensagens[_id] = new String[1000];
        return str;

    }

    /**
     *  Registra o login e retorna o id para identifica-lo
     */
    public int registrar(String login) throws RemoteException {
        if (id == 1000) {
            return -1;
        }
        clientes[id] = login;
        segundos[id] = data.getSeconds();
        mensagens[id][0] = "Servidor: Bem vindo ao chat";
        System.out.println("Cliente: " + login + ", id:" + id + " registrado");
        id++;

        mensagens[id] = new String[1000];
        return id - 1;
    }

    public String[] uruarios() throws RemoteException {

        String[] str = new String[id];
        for (int i = 0; i < id; i++) {
            if (clientes != null) {
                str[i] = clientes[i] + "(" + i + ")";
            }
        }
        return str;
    }

    public void ping() throws RemoteException {
        data = new Date();
        for (int i = 0; i < id; i++) {
//            System.out.println(data);
            if (data.getSeconds() - segundos[i] > 4) {
                System.out.println("sem atividade id:[" + i + "]");
                descadastrar(i);
            }
        }
    }

    /**
     * @return the data
     */
    public Date getData() {
        return data;
    }

    /**
     * @param data the data to set
     */
    public void setData(Date data) {
        this.data = data;
    }

    private void descadastrar(int _id) {
        clientes[_id] = null;

    }
}